# 定义一个类
from types import MethodType


class Student(object):
    pass


# 实例化类,绑定属性name
s = Student()
s.name = 'Tom'
print(s.name)

# 给实例绑定函数
# 但是这个函数只能用于这个实例,不能用于同类的其它实例


def set_name(self, name):
    self.name = name


s.set_name = MethodType(set_name, s)
s.set_name('Tina')
print(s.name)

# 解决这个问题,可以使用给类绑定函数


def set_age(self, age):
    self.age = age


Student.set_age = set_age
s.set_age(18)
print(s.age)


# 使用__slots__限制实例的属性,比如我们只允许对类添加name和age属性
class Teacher(object):
    __slots__ = ('name', 'age')


t = Teacher()
t.name = 'Tom'
t.age = 18
print(t.name)
print(t.age)
# 下面不在__slots__里面的属性就会报错
# t.gender = 'male'

# TODO __slots__只对当前类的实例起作用,对继承的子类不起作用
